*timeout = -1;
- if (display->event_pause_count > 0)
- retval = FALSE;
- else
- retval = (_gdk_event_queue_find_first (display) != NULL);
+ retval = (_gdk_event_queue_find_first (display) != NULL);
gdk_threads_leave ();
gdk_threads_enter ();
- if (event_source->display->event_pause_count > 0)
- retval = FALSE;
- else if (event_source->event_poll_fd.revents & G_IO_IN)
+ if (event_source->display->event_pause_count > 0 ||
+ event_source->event_poll_fd.revents & G_IO_IN)
retval = (_gdk_event_queue_find_first (event_source->display) != NULL);
else
retval = FALSE;
{
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
- if (display->event_pause_count > 0)
- return NULL;
-
- GDK_DISPLAY_GET_CLASS (display)->queue_events (display);
+ if (display->event_pause_count == 0)
+ GDK_DISPLAY_GET_CLASS (display)->queue_events (display);
return _gdk_event_unqueue (display);
}
display->event_pause_count--;
}
-void
-_gdk_display_flush_events (GdkDisplay *display)
-{
- display->flushing_events = TRUE;
-
- while (TRUE)
- {
- GdkEvent *event = _gdk_event_unqueue (display);
- if (event == NULL)
- break;
-
- _gdk_event_emit (event);
- gdk_event_free (event);
- }
-
- display->flushing_events = FALSE;
-}
-
void
_gdk_display_event_data_copy (GdkDisplay *display,
const GdkEvent *event,
guint event_pause_count; /* How many times events are blocked */
guint closed : 1; /* Whether this display has been closed */
- guint flushing_events : 1; /* Inside gdk_display_flush_events */
GArray *touch_implicit_grabs;
GHashTable *device_grabs;
gulong _gdk_display_get_next_serial (GdkDisplay *display);
void _gdk_display_pause_events (GdkDisplay *display);
void _gdk_display_unpause_events (GdkDisplay *display);
-void _gdk_display_flush_events (GdkDisplay *display);
void _gdk_display_event_data_copy (GdkDisplay *display,
const GdkEvent *event,
GdkEvent *new_event);
GList *tmp_list;
GList *pending_motion = NULL;
- if (display->event_pause_count > 0)
- return NULL;
+ gboolean paused = display->event_pause_count > 0;
tmp_list = display->queued_events;
while (tmp_list)
{
GdkEventPrivate *event = tmp_list->data;
- if (!(event->flags & GDK_EVENT_PENDING))
+ if ((event->flags & GDK_EVENT_PENDING) == 0 &&
+ (!paused || (event->flags & GDK_EVENT_FLUSHED) != 0))
{
if (pending_motion)
return pending_motion;
- if (event->event.type == GDK_MOTION_NOTIFY && !display->flushing_events)
+ if (event->event.type == GDK_MOTION_NOTIFY && (event->flags & GDK_EVENT_FLUSHED) == 0)
pending_motion = tmp_list;
else
return tmp_list;
}
}
+void
+_gdk_event_queue_flush (GdkDisplay *display)
+{
+ GList *tmp_list;
+
+ for (tmp_list = display->queued_events; tmp_list; tmp_list = tmp_list->next)
+ {
+ GdkEventPrivate *event = tmp_list->data;
+ event->flags |= GDK_EVENT_FLUSHED;
+ }
+}
+
/**
* gdk_event_handler_set:
* @func: the function to call to handle events from GDK.
* 1) touch events emulating pointer events
* 2) pointer events being emulated by a touch sequence.
*/
- GDK_EVENT_POINTER_EMULATED = 1 << 1
+ GDK_EVENT_POINTER_EMULATED = 1 << 1,
+
+ /* When we are ready to draw a frame, we pause event delivery,
+ * mark all events in the queue with this flag, and deliver
+ * only those events until we finish the frame.
+ */
+ GDK_EVENT_FLUSHED = 1 << 2
} GdkEventFlags;
struct _GdkEventPrivate
GdkEvent *event);
void _gdk_event_queue_handle_motion_compression (GdkDisplay *display);
+void _gdk_event_queue_flush (GdkDisplay *display);
void _gdk_event_button_generate (GdkDisplay *display,
GdkEvent *event);
window = GDK_WINDOW (data);
display = gdk_window_get_display (window);
- _gdk_display_flush_events (display);
+ _gdk_event_queue_flush (display);
_gdk_display_pause_events (display);
gdk_frame_clock_request_phase (clock, GDK_FRAME_CLOCK_PHASE_RESUME_EVENTS);
*timeout = -1;
if (_gdk_display->event_pause_count > 0)
- retval = FALSE;
+ retval = _gdk_event_queue_find_first (_gdk_display) != NULL;
else
retval = (_gdk_event_queue_find_first (_gdk_display) != NULL ||
_gdk_quartz_event_loop_check_pending ());
gdk_threads_enter ();
if (_gdk_display->event_pause_count > 0)
- retval = FALSE;
+ retval = _gdk_event_queue_find_first (_gdk_display) != NULL;
else
retval = (_gdk_event_queue_find_first (_gdk_display) != NULL ||
_gdk_quartz_event_loop_check_pending ());
*timeout = -1;
if (source->display->event_pause_count > 0)
- return FALSE;
+ return _gdk_event_queue_find_first (source->display) != NULL;
/* We have to add/remove the GPollFD if we want to update our
* poll event mask dynamically. Instead, let's just flush all
GdkWaylandEventSource *source = (GdkWaylandEventSource *) base;
if (source->display->event_pause_count > 0)
- return FALSE;
+ return _gdk_event_queue_find_first (source->display) != NULL;
return _gdk_event_queue_find_first (source->display) != NULL ||
source->pfd.revents;
*timeout = -1;
if (_gdk_display->event_pause_count > 0)
- retval = FALSE;
+ retval =_gdk_event_queue_find_first (_gdk_display) != NULL;
else
retval = (_gdk_event_queue_find_first (_gdk_display) != NULL ||
(modal_win32_dialog == NULL &&
gdk_threads_enter ();
if (_gdk_display->event_pause_count > 0)
- retval = FALSE;
+ retval = gdk_event_queue_find_first (_gdk_display) != NULL;
else if (event_poll_fd.revents & G_IO_IN)
retval = (_gdk_event_queue_find_first (_gdk_display) != NULL ||
(modal_win32_dialog == NULL &&
*timeout = -1;
if (display->event_pause_count > 0)
- retval = FALSE;
+ retval = _gdk_event_queue_find_first (display) != NULL;
else
retval = (_gdk_event_queue_find_first (display) != NULL ||
gdk_check_xpending (display));
gdk_threads_enter ();
if (event_source->display->event_pause_count > 0)
- retval = FALSE;
+ retval = _gdk_event_queue_find_first (event_source->display) != NULL;
else if (event_source->event_poll_fd.revents & G_IO_IN)
retval = (_gdk_event_queue_find_first (event_source->display) != NULL ||
gdk_check_xpending (event_source->display));